home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / bmpcut_s / bmpcut_s.lzh / WAVCUT.S < prev    next >
Text File  |  1997-07-12  |  27KB  |  1,121 lines

  1. *********************************************************************************
  2. *    WAV FILE CUTTER                        <WAVCUT.X>    *
  3. *********************************************************************************
  4.  
  5.     .include    doscall.mac
  6.     .include    iocscall.mac
  7.     .include    myconst.h
  8.  
  9.     .text
  10.  
  11. start:
  12.     move.l    8(a0),d0
  13.     and.l    #$ff_ff_ff_fe,d0
  14.     move.l    d0,sp            *スタック セット
  15.     sub.l    a1,d0            *プログラムの終わりからプロセスの終わりまで
  16.     sub.l    #6000,d0        *スタック サイズ
  17.     move.l    d0,buff_size        *残りは、バッファにする
  18.     move.l    a1,buff_addr        *バッファアドレス セット
  19.  
  20.     bsr    cmdchk            *コマンドラインの解析
  21.     bsr    s_name_chk        *セーブファイル名のチェック
  22.     bsr    name_get        *ファイル名を取得し処理する
  23.     bsr    exit            *終了処理
  24.     DOS    _EXIT
  25.  
  26. *****************************************************************
  27. *    ファイル名を取得し、ファイルの読み込みを行う        *
  28. *****************************************************************
  29. name_get:
  30.     clr.w    file_cnt        *ファイル数のカウント初期化
  31.  
  32.     bsr    chkname            *ファイル名に対する前処理
  33.     bsr    chkext            *拡張子が省略されているかチェック
  34.  
  35.     move.w    #ARCHIVE,-(sp)        *最初のファイルを検索する
  36.     pea.l    arg1(pc)        *
  37.     pea.l    filbuf(pc)        *
  38.     DOS    _FILES            *
  39.     lea.l    10(sp),sp        *
  40.  
  41. loop:
  42.     tst.l    d0            *ファイルは見つかったか?
  43.     bmi    done            * 見つからなければ処理完了
  44.  
  45.     bsr    setpath            *得られたファイル名を
  46.                     * フルパスに再構成する
  47.  
  48.     bsr    main            *メイン処理
  49.  
  50.     pea.l    filbuf(pc)        *つぎのファイルを検索する
  51.     DOS    _NFILES            *
  52.     addq.l    #4,sp            *
  53.  
  54.     bra    loop            *繰り返す
  55.  
  56. done:
  57.     bsr    file_cnt_chk        *処理したファイル数のチェック
  58.     rts
  59.  
  60. *****************************************************************
  61. *    files実行に先立ってファイル名に前処理を加える        *
  62. *****************************************************************
  63. chkname:
  64.     pea.l    nambuf(pc)        *ファイル名を展開する
  65.     pea.l    arg1(pc)        *
  66.     DOS    _NAMECK            *
  67.     addq.l    #8,sp            *
  68.  
  69.     tst.l    d0            *d0<0なら
  70.     bmi    in_name_err        * ファイル名の指定に誤りがある
  71.  
  72.     beq    nowild            *d0=0ならワイルドカード指定なし
  73.  
  74.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  75.     bne    wild            * ワイルドカード指定あり
  76.  
  77. noname:                    *ファイル名が指定されていない場合
  78.     lea.l    arg1(pc),a0        *バッファarg1に
  79.     lea.l    nambuf(pc),a1        * nameckで展開したパス名+'*.*'
  80.     bsr    strcpy            * を再構成する
  81.     lea.l    kome0(pc),a1        *
  82.     bsr    strcpy            *
  83.  
  84. wild:                    *ワイルドカードが指定された場合
  85.                     *何もしなくてよい
  86. cknam0:
  87.     rts
  88.  
  89. nowild:                    *ワイルドカードが指定されていない場合
  90.     move.w    #SUBDIR,-(sp)        *サブディレクトリであると仮定して
  91.     pea.l    arg1(pc)        * 検索してみる
  92.     pea.l    filbuf(pc)        *
  93.     DOS    _FILES            *
  94.     lea.l    10(sp),sp        *
  95.     
  96.     tst.l    d0            *見つかったか?
  97.     bmi    cknam0            * 見つからなければファイルだろう
  98.  
  99.     lea.l    arg1(pc),a0        *バッファarg1に
  100.     lea.l    komekome(pc),a1        * もとのファイル名+'\*.*'
  101.     bsr    strcat            * を再構成する
  102.  
  103.     bra    chkname            *nameckでファイル名を展開するために
  104.                     * サブルーチン先頭に戻る
  105.  
  106. *****************************************************************
  107. *    出力パス名をチェックする                *
  108. *****************************************************************
  109. s_name_chk:
  110.     lea.l    arg2(pc),a0        *出力パス名を指定したか?
  111.     tst.b    (a0)
  112.     beq    s_name_chk8        *してない
  113.  
  114.     pea.l    nambuf(pc)        *ファイル名を展開する
  115.     pea.l    arg2(pc)        *
  116.     DOS    _NAMECK            *
  117.     addq.l    #8,sp            *
  118.  
  119.     tst.l    d0            *d0<0なら
  120.     bmi    out_name_err        * パス名の指定に誤りがある
  121.  
  122.     beq    s_name_chk1        *d0=0ならワイルドカード指定なし
  123.  
  124.     cmpi.w    #$00ff,d0        *d0≠FFHなら
  125.     bne    out_name_err        * ワイルドカード指定あり
  126.  
  127. s_name_chk1:
  128.     lea.l    arg2(pc),a0        *ドライブ名を指定しているか?
  129.     cmp.b    #':',1(a0)
  130.     bne    out_name_err        *ドライブ名の指定に誤りがある
  131.  
  132.     tst.b    2(a0)            *ドライブ名のみか
  133.     bne    s_name_chk2        *違う
  134.     addq.l    #2,a0
  135.     bra    s_name_chk9
  136.  
  137. s_name_chk2:
  138.     moveq.l    #0,d0            *セーブ先ドライブ番号を求める
  139.     move.b    (a0),d0
  140.     bsr    toupper
  141.     sub.b    #'A',d0
  142.     add.b    #1,d0
  143.  
  144.     lea.l    spathbuf(pc),a1        *セーブ先ドライブ名
  145.     move.b    (a0),(a1)+
  146.     move.b    #':',(a1)+
  147.     move.b    #'\',(a1)+
  148.  
  149.     move.l    a1,-(sp)        *セーブ先パスをセーブ
  150.     move.w    d0,-(sp)
  151.     DOS    _CURDIR
  152.     addq.l    #6,sp
  153.  
  154.     lea.l    cpathbuf(pc),a2        *カレントパスをセーブしておく
  155.     DOS    _CURDRV
  156.     add.b    #"A",d0
  157.     move.b    d0,(a2)+
  158.     move.b    #':',(a2)+
  159.     move.b    #'\',(a2)+
  160.  
  161.     move.l    a2,-(sp)
  162.     move.w    #0,-(sp)
  163.     DOS    _CURDIR
  164.     addq.l    #6,sp
  165.  
  166.     pea.l    arg2(pc)        *コマンドラインで指定されたパスへ
  167.     DOS    _CHDIR            * 移動してみる
  168.     addq.l    #4,sp
  169.  
  170.     tst.l    d0            *d0が0でなければ
  171.     bmi    path_err        * パス名の指定に誤りがある
  172.  
  173.     pea.l    spathbuf(pc)        *セーブ先パスを戻す
  174.     DOS    _CHDIR
  175.     addq.l    #4,sp
  176.  
  177.     pea.l    cpathbuf(pc)        *カレントパスに戻す
  178.     DOS    _CHDIR
  179.     addq.l    #4,sp
  180.  
  181.     lea.l    arg2(pc),a0        *
  182.     bsr    set_en            *パス名の最後に\マークをセット
  183.     bra    s_name_chk9
  184.  
  185. s_name_chk8:
  186.     lea.l    arg2(pc),a0
  187.     DOS    _CURDRV            *カレントドライブ名GET
  188.     add.b    #"A",d0
  189.     move.b    d0,(a0)+
  190.     move.b    #":",(a0)+
  191.     bra    s_name_chk9
  192.  
  193. s_name_chk9:
  194.     move.l    a0,nameichi
  195.     rts
  196.  
  197. *****************************************************************
  198. *    パス名に¥マークを連結する                *
  199. *****************************************************************
  200. set_en:
  201.     tst.b    (a0)+            *(a0)は0か?
  202.     bne    set_en            *そうでなければ繰り返す
  203.     subq.l    #1,a0            *行きすぎたから1つ戻る
  204.  
  205.     cmp.b    #"\",-1(a0)        *一番最後の文字が¥か
  206.     beq    set_en_            * ¥ならばスキップ
  207.     move.b    #'\',(a0)+        * ¥をセット
  208. set_en_:
  209.     rts
  210.  
  211. *****************************************************************
  212. *    files,nfilesで見付けたファイル名をフルパスに構成し直し    *
  213. *        arg1以降に格納する                *
  214. *****************************************************************
  215. setpath:
  216.     lea.l    arg1(pc),a0        *a0=コピー先
  217.     lea.l    nambuf(pc),a1        *a1=nameckで展開したパス名
  218.     bsr    strcpy            *コピーする
  219.     lea.l    filbuf(pc),a1        *a1=files,nfilesで見付けたファイル名
  220.     lea.l    30(a1),a1
  221.     bsr    strcpy            *連結する
  222.     rts
  223.  
  224. *****************************************************************
  225. *    文字列の連結および複写                    *
  226. *    リターン時a0は文字列末の00Hを指す            *
  227. *****************************************************************
  228. strcat:
  229.     tst.b    (a0)+            *(a0)は0か?
  230.     bne    strcat            *そうでなければ繰り返す
  231.     subq.l    #1,a0            *行きすぎたから1つ戻る
  232. strcpy:
  233.     move.b    (a1)+,(a0)+        *1文字ずつ
  234.     bne    strcpy            *終了コードまでを転送する
  235.     subq.l    #1,a0            *a0は進み過ぎている
  236.                     *a0は文字列末の00Hを指す
  237.     rts
  238.  
  239. *****************************************************************
  240. *    拡張子を補う                        *
  241. *****************************************************************
  242. chkext:
  243.     lea.l    arg1(pc),a0        *ファイル名のアドレス
  244.     lea.l    dext(pc),a1        *拡張子のアドレス
  245. chkext0:
  246.     cmp.b    #".",(a0)        *拡張子があるか
  247.     beq    chkext2
  248.     tst.b    (a0)+            *(a0)は0か?
  249.     bne    chkext0            *そうでなければ繰り返す
  250.     subq.l    #1,a0            *行きすぎたから1つ戻る
  251. chkext1:
  252.     move.b    (a1)+,(a0)+        *1文字転送
  253.     bne    chkext1            *終了コードまで繰り返す
  254. chkext2:
  255.     rts
  256.  
  257. *****************************************************************
  258. *    コマンドラインのチェックを行う                *
  259. *****************************************************************
  260. cmdchk:
  261.     lea.l    arg1(pc),a0        *a0=引数切り出し領域
  262.     clr.b    256(a0)            *出力ファイル名をちょっと初期化
  263.     addq.l    #1,a2            *a2=コマンドライン文字列先頭
  264.  
  265. cmdchk0:
  266.     bsr    switch_chk        *スイッチのチェック
  267.  
  268.     tst.b    (a2)            *引数があるか?
  269.     beq    usage            *ないならファイル名が足りない
  270.     bsr    getarg            *ファイル名切り出し
  271.     lea.l    256(a0),a0        *a0=a0+256
  272.     bsr    switch_chk        *さらにスイッチのチェック
  273.     bsr    getarg            *ファイル名切り出し
  274.     bsr    switch_chk        *さらにスイッチのチェック
  275.     tst.b    (a2)            *引数があるか?
  276.     bne    usage            * あるなら引数が多い
  277. cmdchk1:
  278.     rts
  279.  
  280. *****************************************************************
  281. *    スペースを飛ばしつぎの引数先頭までポインタを進め    *
  282. *    スイッチがあれば処理してしまう                *
  283. *****************************************************************
  284. switch_chk:
  285.     bsr    skipsp            *スペースをスキップする
  286.     tst.b    (a2)            *まだスイッチがあるか?
  287.     beq    switch_chk2        *ないなら戻る(処理の振り分けを行う)
  288.  
  289.     cmpi.b    #'/',(a2)        *引数の先頭が
  290.     beq    switch_chk1        */,-であれば
  291.     cmpi.b    #'-',(a2)        *  スイッチ
  292.     beq    switch_chk1        *
  293.     bra    switch_chk2        *スイッチでないなら戻る
  294.  
  295. switch_chk1:
  296.     addq.l    #1,a2            *'/'や'-'の分ポインタを進める
  297.     tst.b    (a2)            *スイッチがあるか?
  298.     beq    usage            * ないなら使用方表示
  299.     move.b    (a2)+,d0        *1文字取り出す
  300.     bsr    toupper            *大文字に変換しておく
  301.     bra    usage            *無効なスイッチが指定された
  302.  
  303. switch_chk2:
  304.     rts
  305.  
  306. *****************************************************************
  307. *    ファイル名を切り出す                    *
  308. *****************************************************************
  309. getarg:
  310.     move.l    a0,-(sp)        *{レジスタ待避
  311. gtarg0:    tst.b    (a2)            *1)文字列の終端コードか
  312.     beq    gtarg1            *
  313.     cmpi.b    #SPACE,(a2)        *2)スペースか
  314.     beq    gtarg1            *
  315.     cmpi.b    #TAB,(a2)        *3)タブか
  316.     beq    gtarg1            *
  317. *    cmpi.b    #'-',(a2)        *4)ハイフンか
  318. *    beq    gtarg1            *
  319.     cmpi.b    #'/',(a2)        *5)スラッシュ
  320.     beq    gtarg1            *
  321.     move.b    (a2)+,(a0)+        * が現れるまで転送を
  322.     bra    gtarg0            * 繰り返す
  323. gtarg1:    clr.b    (a0)            *文字列終端コードを書き込む
  324.     movea.l    (sp)+,a0        *}レジスタ復帰
  325.     rts
  326.  
  327. *****************************************************************
  328. *    スペース・TABをスキップする                *
  329. *****************************************************************
  330. skipsp0:
  331.     addq.l    #1,a2
  332. skipsp:
  333.     cmpi.b    #$20,(a2)
  334.     beq    skipsp0
  335.     cmpi.b    #$09,(a2)
  336.     beq    skipsp0
  337.     rts
  338.  
  339. *****************************************************************
  340. *    小文字→大文字変換ルーチン                *
  341. *****************************************************************
  342. toupper:
  343.     cmpi.b    #'a',d0
  344.     bcs    toupr0
  345.     cmpi.b    #'z'+1,d0
  346.     bcc    toupr0
  347.     subi.b    #$20,d0
  348. toupr0:
  349.     rts
  350.  
  351. *****************************************************************
  352. *    メイン処理                        *
  353. *****************************************************************
  354. main:
  355.     clr.w    edaban
  356.     bsr    save_name_get
  357.     lea.l    arg1(pc),a0        *ファイル名セット
  358.     bsr    file_open        *ファイルオープン
  359.     bsr    file_size        *ファイルサイズを調べる
  360.     move.l    d6,filesize
  361.  
  362.     cmp.l    buff_size(pc),d6
  363.     bhi    small            *一括ロード分のメモリが無い
  364.  
  365.     bsr    yomikomi_prt
  366.     movea.l    buff_addr(pc),a6
  367.     bsr    file_read        *ファイル読む
  368.     bsr    file_close        *ファイルクローズ
  369.  
  370.     movea.l    a6,a1
  371.     movea.l    a6,a2
  372.     adda.l    d6,a2
  373.     movea.l    a1,a3
  374.  
  375. main0:
  376.     bsr    kensaku_prt
  377.     movea.l    a1,a4
  378. main0_:
  379.     cmp.l    a1,a4
  380.     bne    main1
  381.     bsr    ichi_prt
  382.     lea.l    1024(a4),a4
  383.  
  384. main1:
  385.     cmp.l    a1,a2
  386.     bls    main9
  387.  
  388.     cmp.b    #"R",(a1)+
  389.     bne    main0_
  390.     cmp.b    #"I",(a1)
  391.     bne    main0_
  392.     cmp.b    #"F",1(a1)
  393.     bne    main0_
  394.     cmp.b    #"F",2(a1)
  395.     bne    main0_
  396.  
  397.     cmp.b    #"W",7(a1)
  398.     bne    main0_
  399.     cmp.b    #"A",8(a1)
  400.     bne    main0_
  401.     cmp.b    #"V",9(a1)
  402.     bne    main0_
  403.     cmp.b    #"E",10(a1)
  404.     bne    main0_
  405.     cmp.b    #"f",11(a1)
  406.     bne    main0_
  407.     cmp.b    #"m",12(a1)
  408.     bne    main0_
  409.     cmp.b    #"t",13(a1)
  410.     bne    main0_
  411.     cmp.b    #" ",14(a1)
  412.     bne    main0_
  413.  
  414. main2:
  415.     subq.l    #1,a1
  416.     bsr    hakken_prt
  417.     bsr    ichi_prt
  418.  
  419.     move.b    7(a1),d0        *WAV SIZE
  420.     lsl.w    #8,d0
  421.     move.b    6(a1),d0
  422.     swap    d0
  423.     move.b    5(a1),d0
  424.     lsl.w    #8,d0
  425.     move.b    4(a1),d0
  426.     addq.l    #8,d0
  427.     move.l    d0,wavsize
  428.  
  429.     movea.l    a1,a6            *セーブアドレス
  430.     bsr    wav_save
  431.     add.l    wavsize(pc),a1
  432.  
  433.     addq.w    #1,file_cnt        *ファイル数のカウント+1
  434.     bra    main0
  435.  
  436. main9:
  437.     bsr    kensaku2_prt
  438.     bsr    ichi_prt
  439.     lea.l    crlf_mes(pc),a0
  440.     bsr    mesput
  441.     rts
  442.  
  443. *****************************************************************
  444. *    省メモリルーチン ちまちまロード            *
  445. *****************************************************************
  446. small:
  447.     move.l    d6,d5
  448.     bsr    yomikomi_prt
  449.  
  450. small0:    
  451.     bsr    kensaku_prt
  452.     movea.l    d5,a4
  453.  
  454. small1:
  455.     cmp.l    d5,a4
  456.     bcs    small2
  457.     bsr    ichi_prt1
  458.     lea.l    -1024(a4),a4
  459.     cmp.l    #1024,d5
  460.     bhi    small2
  461.     clr.l    a4
  462.  
  463. small2:
  464.     subq.l    #1,d5        *識別子チェック
  465.     bls    small9
  466.     bsr    getc
  467. small3:
  468.     cmp.b    #"W",d0
  469.     bne    small1
  470.  
  471.     subq.l    #1,d5
  472.     bls    small9
  473.     bsr    getc
  474.     cmp.b    #"A",d0
  475.     bne    small3
  476.  
  477.     cmp.l    #16,d5
  478.     bls    small9
  479.  
  480.     movea.l    buff_addr(pc),a6    *ヘッダの一部を読み込む
  481.     addq.l    #2,a6
  482.     move.l    #16-2,d6        *"WA"を除いた分
  483.     bsr    file_read
  484.     subq.l    #2,a6
  485.  
  486.     cmp.w    #"FF",2(a6)
  487.     bne    small4
  488.     cmp.l    #"WAVE",8(a6)
  489.     bne    small4
  490.     cmp.l    #"fmt ",12(a6)
  491.     beq    small5
  492.  
  493. small4:
  494.     move.w    #1,-(sp)        *ちがったので
  495.     move.l    #-16,-(sp)        *位置を戻す
  496.     move.w    d7,-(sp)
  497.     DOS    _SEEK
  498.     addq.l    #8,sp
  499.     bra    small1
  500.  
  501. small5:
  502.     addq.l    #2,d5
  503.     bsr    hakken_prt
  504.     bsr    ichi_prt1
  505.  
  506.     move.l    4(a6),d0        *WAV SIZE
  507.     bsr    i_to_m
  508.     addq.l    #8,d0
  509.     move.l    d0,wavsize
  510.     sub.l    d0,d5
  511.  
  512.     cmp.l    buff_size(pc),d0
  513.     bhi    no_buff            *メモリが無い
  514.  
  515.     lea.l    16(a6),a6        *残りを読み込む
  516.     move.l    d0,d6
  517.     sub.l    #16,d6
  518.     bsr    file_read
  519.     lea.l    -16(a6),a6
  520.  
  521.     move.b    #"W",(a6)
  522.     move.b    #"A",1(a6)
  523.     move.l    d7,d1            *ファイルハンドルを取っておく
  524.     bsr    wav_save
  525.     move.l    d1,d7
  526.  
  527.     addq.w    #1,file_cnt        *ファイル数のカウント+1
  528.     bra    small0
  529.  
  530. small9:
  531.     bsr    file_close        *ファイルクローズ
  532.     bsr    kensaku2_prt
  533.     moveq.l    #0,d5
  534.     bsr    ichi_prt1
  535.     lea.l    crlf_mes(pc),a0
  536.     bsr    mesput
  537.     rts
  538.  
  539. i_to_m:
  540.     ror.w    #8,d0
  541.     swap.w    d0
  542.     ror.w    #8,d0
  543.     rts
  544.  
  545. *****************************************************************
  546. *    検索位置を表示する                    *
  547. *****************************************************************
  548. ichi_prt:
  549.     IOCS    _B_UP_S
  550.     moveq.l    #10,d1
  551.     IOCS    _B_RIGHT
  552.     move.l    a1,d0
  553.     sub.l    a3,d0
  554.     bra    ichi_prt2
  555.  
  556. ichi_prt1:
  557.     IOCS    _B_UP_S
  558.     moveq.l    #10,d1
  559.     IOCS    _B_RIGHT
  560.     move.l    filesize(pc),d0
  561.     sub.l    d5,d0
  562.  
  563. ichi_prt2:
  564.     lea.l    dec_buf(pc),a0
  565.     bsr    bin2dec
  566.     bsr    zero_keshi
  567.     lea.l    dec_buf(pc),a0
  568.     bsr    mesput
  569.  
  570.     lea.l    sla_mes(pc),a0
  571.     bsr    mesput
  572.  
  573.     move.l    filesize(pc),d0
  574.     lea.l    dec_buf(pc),a0
  575.     bsr    bin2dec
  576.     bsr    zero_keshi
  577. *    lea.l    dec_buf(pc),a0
  578.     bsr    mesput
  579.  
  580.     lea.l    crlf_mes(pc),a0
  581.     bsr    mesput
  582.  
  583.     rts
  584.  
  585. *****************************************************************
  586. *    セーブするファイル名を作る                *
  587. *****************************************************************
  588. save_name_get:
  589.     movea.l    nameichi(pc),a0
  590.     lea.l    filbuf(pc),a1
  591.     lea.l    30(a1),a1
  592.     bsr    strcpy
  593.  
  594.     movea.l    nameichi(pc),a0
  595.     moveq.l    #15-1,d0
  596. sn_get0:
  597.     cmp.b    #".",(a0)+
  598.     beq    sn_get1
  599.     dbra.w    d0,sn_get0
  600.     addq.l    #1,a0
  601. sn_get1:
  602.     addq.l    #2,a0
  603.     move.l    a0,edaichi
  604.     move.b    #"0",-3(a0)
  605.     move.b    #"0",-2(a0)
  606.     move.b    #"0",-1(a0)
  607.     move.b    #".",(a0)
  608.     move.b    #"W",1(a0)
  609.     move.b    #"A",2(a0)
  610.     move.b    #"V",3(a0)
  611.     move.b    #0,4(a0)
  612.     rts
  613.  
  614. *****************************************************************
  615. *    ディスクに書き込む                    *
  616. *****************************************************************
  617. wav_save:
  618.     bsr    setdec            *ファイル名作成
  619.  
  620.     move.l    wavsize(pc),d6        *セーブサイズ
  621.     move.l    d6,d0
  622.     lea.l    dec_buf(pc),a0
  623.     bsr    bin2dec            *ファイルサイズを10進に変換
  624.     bsr    zero_keshi
  625.     bsr    name_prt
  626.  
  627.     bsr    conv_prt        *'セーブ中'を表示
  628.     lea.l    arg2(pc),a0
  629.     bsr    create            *ファイル作成
  630.     bsr    write            *画像データの書き込み
  631.     bsr    file_close        *ファイルクローズ
  632.     bsr    ok_prt            *'OK!'を表示
  633.     rts
  634.  
  635. *****************************************************************
  636. *    ファイル名の枝番をセットする                *
  637. *****************************************************************
  638. setdec:
  639.     add.w    #1,edaban
  640.     move.w    edaban(pc),d0        *枝番を転送
  641.     andi.l    #$0000FFFF,d0        *上位ワードをクリア
  642.     movea.l    edaichi,a0        *転送位置
  643.  
  644. setdec0:
  645.     divu.w    #10,d0            *d0.lを10で割る
  646.     swap.w    d0            *上位ワードと下位ワードを交換
  647.     addi.w    #'0',d0            *0~9 → '0'~'9'
  648.     move.b    d0,-(a0)        *1桁格納
  649.     clr.w    d0            *次の除算に備える
  650.     swap.w    d0            *上位ワードと下位ワードを交換
  651.     bne    setdec0
  652.     rts
  653.  
  654. *****************************************************************
  655. *    2進=>10進                        *
  656. *    d0 変換元の数値 a0 変換後の格納アドレス            *
  657. *****************************************************************
  658. bin2dec:
  659.     PUSH    d0-d3/a0-a1
  660.     moveq.l    #10-1,d1
  661.     lea.l    exp_tbl(pc),a1
  662. bin2dec0:
  663.     clr.b    d2
  664.     move.l    (a1)+,d3
  665. bin2dec1:
  666.     or    d3,d3
  667.     sub.l    d3,d0
  668.     bcs    bin2dec2
  669.     addq.b    #1,d2
  670.     bra    bin2dec1
  671. bin2dec2:
  672.     add.l    d3,d0
  673.     add.b    #'0',d2
  674.     move.b    d2,(a0)+
  675.     dbra    d1,bin2dec0
  676.     POP    d0-d3/a0-a1
  677.     rts
  678.  
  679. exp_tbl:
  680.     .dc.l    1000000000
  681.     .dc.l    100000000
  682.     .dc.l    10000000
  683.     .dc.l    1000000
  684.     .dc.l    100000
  685.     .dc.l    10000
  686.     .dc.l    1000
  687.     .dc.l    100
  688.     .dc.l    10
  689.     .dc.l    1
  690.  
  691. *****************************************************************
  692. *    ファイルサイズの頭にある'0'を消す            *
  693. *****************************************************************
  694. zero_keshi:
  695.     lea.l    dec_buf(pc),a0
  696.     moveq.l    #9-1,d0
  697. zero_keshi0:
  698.     cmp.b    #'0',(a0)
  699.     bne    zero_keshi9
  700.     move.b    #' ',(a0)+
  701.     dbra.w    d0,zero_keshi0
  702. zero_keshi9:
  703.     rts
  704.  
  705. *****************************************************************
  706. *    ファイルのOPENを行う                *
  707. *****************************************************************
  708. file_open:
  709.     move.w    #0,-(sp)        *ファイルopen
  710.     move.l    a0,-(sp)
  711.     DOS    _OPEN
  712.     addq.l    #6,sp
  713.     tst.l    d0            *OK?
  714.     bmi    open_err
  715.     move.l    d0,d7            *ファイルハンドルセーブ
  716.     rts
  717.  
  718. *****************************************************************
  719. *    ファイルのサイズを求める(d6に返す)            *
  720. *****************************************************************
  721. file_size:
  722.     move.w    #2,-(sp)
  723.     move.l    #0,-(sp)
  724.     move.w    d7,-(sp)
  725.     DOS    _SEEK
  726.     addq.l    #8,sp
  727.     tst.l    d0            *OK?
  728.     bmi    read_err
  729.  
  730.     move.l    d0,d6
  731.  
  732.     move.w    #0,-(sp)
  733.     move.l    #0,-(sp)
  734.     move.w    d7,-(sp)
  735.     DOS    _SEEK
  736.     addq.l    #8,sp
  737.     tst.l    d0            *OK?
  738.     bmi    read_err
  739.     rts
  740.  
  741. *****************************************************************
  742. *    ディスクから1文字読み出しを行う            *
  743. *****************************************************************
  744. getc:
  745.     move.w    d7,-(sp)
  746.     DOS    _FGETC            *$FF1B
  747.     addq.l    #2,sp
  748.     tst.l    d0
  749.     bmi    read_err
  750.     rts
  751.  
  752. *****************************************************************
  753. *    ディスクからデータの読み込みを行う            *
  754. *****************************************************************
  755. file_read:
  756.     move.l    d6,-(sp)        *データサイズ
  757.     move.l    a6,-(sp)        *バッファアドレス
  758.     move.w    d7,-(sp)        *ファイルハンドル
  759.     DOS    _READ
  760.     lea    10(sp),sp        *スタック補正
  761.     tst.l    d0            *OK?
  762.     bmi    read_err
  763.     cmp.l    d6,d0            *全部読めたか
  764.     bne    read_err
  765.     rts
  766.  
  767. *****************************************************************
  768. *    ファイル作成                        *
  769. *****************************************************************
  770. create:
  771.     move.w    #$20,-(sp)        *ファイルCREATE
  772.     move.l    a0,-(sp)
  773.     DOS    _CREATE
  774.     addq.l    #6,sp
  775.  
  776.     tst.l    d0        *OK?
  777.     bmi    create_err
  778.     move.l    d0,d7            *ファイルハンドルセーブ
  779.     rts
  780.  
  781. *****************************************************************
  782. *    ディスクに書き込む                    *
  783. *****************************************************************
  784. write:
  785.     move.l    d6,-(sp)        *データサイズ
  786.     move.l    a6,-(sp)        *バッファアドレス
  787.     move.w    d7,-(sp)        *ファイルハンドル
  788.     DOS    _WRITE
  789.     lea.l    10(sp),sp        *スタック補正
  790.     tst.l    d0            *OK?
  791.     bmi    write_err
  792.     cmp.l    d6,d0            *全部書き込めたか?
  793.     bne    write_err
  794.     rts
  795.  
  796. *****************************************************************
  797. *    ファイルをCLOSEする                *
  798. *****************************************************************
  799. file_close:
  800.     move.w    d7,-(sp)        *ファイルCLOSE
  801.     DOS    _CLOSE
  802.     addq.l    #2,sp
  803.     rts
  804.  
  805. *****************************************************************
  806. *    処理したファイル数をチェックする            *
  807. *****************************************************************
  808. file_cnt_chk:
  809.     moveq.l    #0,d0
  810.     move.w    file_cnt(pc),d0
  811.     beq    file_cnt_chk1
  812.  
  813.     lea.l    dec_buf(pc),a0        *あり
  814.     bsr    bin2dec
  815.     bsr    zero_keshi
  816.     bsr    mesput
  817.     lea.l    some_files_mes(pc),a0
  818.     bsr    mesput
  819.     bra    file_cnt_chk9
  820.  
  821. file_cnt_chk1:
  822.     lea.l    no_file_mes(pc),a0    *なし
  823.     bsr    mesput
  824.  
  825. file_cnt_chk9:
  826.     rts
  827.  
  828. *****************************************************************
  829. *    '読み込み中'を表示                    *
  830. *****************************************************************
  831. yomikomi_prt:
  832.     lea.l    filbuf(pc),a0
  833.     lea.l    30(a0),a0
  834.     bsr    mesput
  835.     lea.l    yomikomi_mes(pc),a0
  836.     bsr    mesput
  837.     rts
  838.  
  839. *****************************************************************
  840. *    '検索中'を表示                        *
  841. *****************************************************************
  842. kensaku_prt:
  843.     lea.l    kensaku_mes(pc),a0
  844.     bsr    mesput
  845.     rts
  846.  
  847. *****************************************************************
  848. *    '発見!'を表示                        *
  849. *****************************************************************
  850. hakken_prt:
  851.     IOCS    _B_UP_S
  852.     lea.l    hakken_mes(pc),a0
  853.     bsr    mesput
  854.     rts
  855.  
  856. *****************************************************************
  857. *    '検索終了'を表示                    *
  858. *****************************************************************
  859. kensaku2_prt:
  860.     IOCS    _B_UP_S
  861.     lea.l    kensaku2_mes(pc),a0
  862.     bsr    mesput
  863.     rts
  864.  
  865. *****************************************************************
  866. *    'セーブ中'を表示                    *
  867. *****************************************************************
  868. conv_prt:
  869.     lea.l    conv_mes(pc),a0
  870.     bsr    mesput
  871.     rts
  872.  
  873. *****************************************************************
  874. *    'OK!'を表示                        *
  875. *****************************************************************
  876. ok_prt:
  877.     lea.l    ok_mes(pc),a0
  878.     bsr    mesput
  879.     rts
  880.  
  881. *****************************************************************
  882. *    セーブファイル名&サイズを表示する            *
  883. *****************************************************************
  884. name_prt:
  885.     lea.l    arg2(pc),a0
  886.     bsr    mesput
  887.     lea.l    dec_buf(pc),a0
  888.     bsr    mesput
  889.     lea.l    byte_mes(pc),a0
  890.     bsr    mesput
  891.     rts
  892.  
  893. *****************************************************************
  894. *    入力ファイル名エラー                    *
  895. *****************************************************************
  896. in_name_err:
  897.     lea.l    in_mes(pc),a0
  898.     bsr    mesput
  899.     lea.l    name_er_mes(pc),a0
  900.     bsr    mesput
  901.     bra    exit2
  902.  
  903. *****************************************************************
  904. *    出力パス名エラー                    *
  905. *****************************************************************
  906. out_name_err:
  907.     lea.l    out_mes(pc),a0
  908.     bsr    mesput
  909.     lea.l    name_er_mes(pc),a0
  910.     bsr    mesput
  911.     bra    exit2
  912.  
  913. *****************************************************************
  914. *    出力先パスが見付からない                *
  915. *****************************************************************
  916. path_err:
  917.     lea.l    out_mes(pc),a0
  918.     bsr    mesput
  919.     lea.l    name_er_mes(pc),a0
  920.     bsr    mesput
  921.     bra    exit2
  922.  
  923. *****************************************************************
  924. *    メモリが足りない                    *
  925. *****************************************************************
  926. no_buff:
  927.     bsr    file_close
  928.     lea.l    no_buff_mes(pc),a0
  929.     bsr    mesput
  930.     bra    exit2
  931.  
  932. *****************************************************************
  933. *    ファイルが見付からない                    *
  934. *****************************************************************
  935. open_err:
  936.     lea.l    arg1(pc),a0
  937.     bsr    mesput
  938.     lea.l    open_er_mes(pc),a0
  939.     bsr    mesput
  940.     bra    exit2
  941.  
  942. *****************************************************************
  943. *    ファイル作成エラー                    *
  944. *****************************************************************
  945. create_err:
  946.     lea.l    arg2(pc),a0
  947.     bsr    mesput
  948.     lea.l    create_er_mes(pc),a0
  949.     bsr    mesput
  950.     bra    exit2
  951.  
  952. *****************************************************************
  953. *    ファイル書き込みエラー                    *
  954. *****************************************************************
  955. write_err:
  956.     lea.l    arg2(pc),a0
  957.     bsr    mesput
  958.     lea.l    write_er_mes(pc),a0
  959.     bsr    mesput
  960.     bra    exit2
  961.  
  962. *****************************************************************
  963. *    読み込みエラー                        *
  964. *****************************************************************
  965. read_err:
  966.     lea.l    arg1(pc),a0
  967.     bsr    mesput
  968.     lea.l    read_er_mes(pc),a0
  969.     bsr    mesput
  970.     bra    exit2
  971.  
  972. *****************************************************************
  973. *    ディスクの空き容量が足りないエラー            *
  974. *****************************************************************
  975. no_free_err:
  976.     lea.l    no_free_mes(pc),a0
  977.     bsr    mesput
  978.     bra    exit2
  979.  
  980. *****************************************************************
  981. *    使用方表示                        *
  982. *****************************************************************
  983. usage:
  984.     lea.l    usage_mes(pc),a0
  985.     bsr    mesput
  986.     bra    exit2
  987.  
  988. *****************************************************************
  989. *    メッセージ表示                        *
  990. *****************************************************************
  991. mesput:
  992. *    move.w    #STDERR,-(sp)        *標準エラー出力へ
  993.     move.w    #STDOUT,-(sp)        *標準出力へ
  994.     move.l    a0,-(sp)        *メッセージを
  995.     DOS    _FPUTS            *出力する
  996.     addq.l    #6,sp            *スタック補正
  997.     rts
  998.  
  999. *****************************************************************
  1000. *    終了処理                        *
  1001. *****************************************************************
  1002. exit:
  1003.     IOCS    _OS_CURON        *カーソル表示
  1004.  
  1005.     move.w    #-1,-(sp)        *キーバッファクリア
  1006.     DOS    _KFLUSH
  1007.     addq.l    #2,sp
  1008.     rts
  1009.  
  1010. *****************************************************************
  1011. *    エラー処理2                        *
  1012. *****************************************************************
  1013. exit2:
  1014.     bsr    exit
  1015.     move.w    #1,-(sp)        *終了コード1を持って
  1016.     DOS    _EXIT2            * エラー終了
  1017.  
  1018. *****************************************************************
  1019. *    データエリア                        *
  1020. *****************************************************************
  1021.     .data
  1022.     .even
  1023. usage_mes:
  1024.     .dc.b    'WAV FILE CUTTER V0.01 by A.MUKAWA',CR,LF
  1025.     .dc.b    '機能:ファイル中に含まれているWAVファイルを切り出します。',CR,LF
  1026.     .dc.b    '用法:WAVCUT ファイル名 [出力先パス名]',CR,LF
  1027.     .dc.b    CR,LF
  1028.     .dc.b    '切り出される画像のファイル名は、元のファイル名(最大15文字)の',CR,LF
  1029.     .dc.b    '後ろに3桁の数字が付き、拡張子が"WAV"のファイル名になります。',CR,LF
  1030.     .dc.b    'このファイル名は8文字を超える事が多いので、注意して下さい。',CR,LF
  1031.     .dc.b    0
  1032.  
  1033.  
  1034. some_files_mes:
  1035.     .dc.b    '個のWAVファイルを切り出せました。',CR,LF,0
  1036. no_file_mes:
  1037.     .dc.b    'WAVファイルは見つかりませんでした。',CR,LF,0
  1038. in_mes:
  1039.     .dc.b    '入力ファイル',0
  1040. out_mes:
  1041.     .dc.b    '出力先パス',0
  1042. name_er_mes:
  1043.     .dc.b    '名の指定に間違いがあります!',CR,LF,0
  1044. open_er_mes:
  1045.     .dc.b    ' が見つかりません!',CR,LF,0
  1046. read_er_mes:
  1047.     .dc.b    ' の読み込みエラーが発生しました!',CR,LF,0
  1048. create_er_mes:
  1049.     .dc.b    ' が作れません!',CR,LF,0
  1050. write_er_mes:
  1051.     .dc.b    ' の書き込みエラーが発生しました!',CR,LF,0
  1052. no_buff_mes:
  1053.     .dc.b    '変換に必要なメモリがありません!',CR,LF,0
  1054. no_free_mes:
  1055.     .dc.b    'セーブ先の空き容量が足りません!',CR,LF,0
  1056. yomikomi_mes:
  1057.     .dc.b    ' を読み込み中です。',CR,LF,CR,LF,0
  1058. hakken_mes:
  1059.     .dc.b    '発見!',CR,LF,0
  1060. kensaku_mes:
  1061.     .dc.b    '検索中',CR,LF,0
  1062. kensaku2_mes:
  1063.     .dc.b    '検索終了',CR,LF,0
  1064. sla_mes:
  1065.     .dc.b    '/',0
  1066. byte_mes:
  1067.     .dc.b    'byte ',0
  1068. conv_mes:
  1069.     .dc.b    '《セーブ中》 ',,0
  1070. ok_mes:
  1071.     .dc.b    'OK!',CR,LF,CR,LF,0
  1072. crlf_mes:
  1073.     .dc.b    CR,LF,0
  1074.  
  1075. dext:
  1076.     .dc.b    '.*',0            *補う拡張子
  1077. komekome:
  1078.     .dc.b    '\'
  1079. kome0:
  1080.     .dc.b    '*.*',0
  1081.  
  1082. *****************************************************************
  1083. *    ワークエリア                        *
  1084. *****************************************************************
  1085.     .bss
  1086.     .even
  1087. filbuf:
  1088.     .ds.b    53            *ファイル情報格納バッファ
  1089. nambuf:
  1090.     .ds.b    92            *ファイル名展開用バッファ
  1091. arg1:
  1092.     .ds.b    256            *入力ファイル名バッファ
  1093. arg2:
  1094.     .ds.b    256            *出力ファイル名バッファ
  1095. cpathbuf
  1096.     .ds.b    65            *カレントパス名バッファ
  1097. spathbuf
  1098.     .ds.b    65            *セーブ先パス名バッファ
  1099.     .even
  1100. file_cnt:
  1101.     .ds.w    1            *ファイル数のカウント用バッファ
  1102. buff_addr:
  1103.     .ds.l    1            *画像読み込みバッファアドレス
  1104. buff_size:
  1105.     .ds.l    1            *画像読み込みバッファサイズ
  1106. filesize:
  1107.     ds.l    1
  1108. wavsize:
  1109.     ds.l    1
  1110. edaban:
  1111.     .ds.w    1
  1112. nameichi:
  1113.     .ds.l    1
  1114. edaichi:
  1115.     .ds.l    1
  1116. dec_buf:
  1117.     .ds.b    10*2
  1118.     .even
  1119.  
  1120.     .end    start
  1121.